#pragma once

//守护进程化

//1.调用的进程失去组长身份
//2.忽略信号
//3.文件描述符关闭
//4.setsid()
//5.更改工作路径

#include <iostream>

#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void daemon()
{
    int ret = 0;
    //忽略信号
    signal(SIGPIPE, SIG_IGN); //忽略管道信号
    signal(SIGCHLD, SIG_IGN); //忽略子进程回收信号

    //去掉组长身份
    if(fork() > 0) exit(0); //如果调用成功 则原进程退出，子进程进行接下来的工作(组长进程就退出了) 偷梁换柱

    pid_t pd = setsid();
    if((int)pd < 0)
    {
        std::cout<<"setsid error!"<<std::endl;
        exit(-1);
    }

    //更改工作路径
    ret = chdir("/home/ARMCSKGT/"); //更改到用户目录下
    if(ret < 0) std::cout<<"warning:chdir error!"<<std::endl;

    int fd = open("/dev/null",O_RDWR); //以可读可写打开
    if(fd < 0)
    {
        std::cout<<"open /dev/null file error!"<<std::endl;
        exit(-2);
    }

    //将三个标准输出流全部重定向到
    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);

    close(fd); //结束后关闭fd
}